2 Problem: 10482 - The Candyman can
14 const int SIZE
= 52, MAXN
= 32;
17 dp[i][a][b] = verdadero si puedo repartir las primeras
18 i monedas en tres grupos tales que el grupo con mayor peso
19 tenga a unidades más que el grupo con menos peso & el grupo
20 de la mitad tenga b unidades más que el grupo con menos peso
22 bool dp
[MAXN
][SIZE
+1][SIZE
+1];
27 for (int C
=1; C
<=Casos
; C
++){
31 for (int i
=0; i
<n
; ++i
){
38 for (int i
=0; i
<n
; ++i
)
39 for (int a
=0; a
<=sum
; ++a
)
40 for (int b
=0; b
<=sum
; ++b
)
43 cout
<< "Case " << C
<< ": ";
44 //cout << "Sum: " << sum << endl;
47 dp
[0][w
[0]][0] = true;
48 for (int i
=0; i
<n
-1; ++i
)
49 for (int a
=0; a
<=sum
; ++a
)
50 for (int b
=0; b
<=sum
; ++b
)
52 //Intento agregar el confite i+1-ésimo a los tres grupos
53 //teniendo en cuenta las nuevas diferencias que puedan formarse
54 //por ejemplo, al agregar un confite muy pesado al grupo con menos peso
55 //este podría convertirse en el grupo con más peso, asi que hay que sacar las diferencias
56 for (int j
=0; j
<3; ++j
){
58 t
[0] = a
, t
[1] = b
, t
[2] = 0;
60 sort(t
.begin(), t
.end());
61 if (t
[2] - t
[0] <= sum
&& t
[1] - t
[0] <= sum
){
62 dp
[i
+1][t
[2] - t
[0]][t
[1] - t
[0]] = true;
63 //printf("\ndp[%d][%d][%d] -> dp[%d][%d][%d] = true", i, a, b, i+1, t[2]-t[0], t[1]-t[0]);
69 for (int i=0; i<n; ++i){
70 cout << "Usando las primeras " << i << " monedas: " << endl;
71 for (int a=0; a<=sum; ++a){
72 for (int b=0; b<=sum; ++b){
73 cout << dp[i][a][b] << " ";
81 for (int a
=0; a
<=sum
&& answer
== -1; ++a
)
82 for (int b
=0; b
<=a
&& answer
== -1; ++b
)
85 //cout << "b es : " << b << endl;
88 cout
<< answer
<< endl
;